package com.mazaiting.mybatisplus.encrypt.encryptor;

import com.mazaiting.mybatisplus.encrypt.IEncryptor;
import org.jasypt.util.text.TextEncryptor;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 加密处理器
 * @author danghailiang
 */
public abstract class CachedTextEncryptor implements IEncryptor {
    /**
     * 存储加密器集合
     */
    private final Map<String, TextEncryptor> cache = new ConcurrentHashMap<>();

    /**
     * 加密方法
     * @param param 待加密的value
     * @param key   签名Key
     * @return  返回被加密的字符
     * @throws Exception    异常处理
     */
    @Override
    public String encrypt(Object param, String key) throws Exception {
        if (param == null) {
            return null;
        }
        return get(key).encrypt(param.toString());
    }

    /**
     * 加密方法
     * @param param 待解密的value
     * @param key   签名Key
     * @return  返回被解密的字符
     * @throws Exception    异常处理
     */
    @Override
    public String decrypt(Object param, String key) throws Exception {
        if (param == null) {
            return null;
        }
        return get(key).decrypt(param.toString());
    }

    /**
     * 获取签名
     * @param key 签名
     * @return 返回加密器
     */
    protected TextEncryptor get(String key) {
        return cache.computeIfAbsent(key, this::createTextEncryptor);
    }

    /**
     * 初始化Key
     * @param key 签名
     * @return  返回加密器
     */
    protected abstract TextEncryptor createTextEncryptor(String key);
}
